package com.qyer.util.log.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.qyer.util.log.common.Constants;
import com.qyer.util.log.entity.TrackInfo;

/**
 * 类描述：对象相互格式化
 * 
 * @author: 58.com
 * @date： 日期：2012-11-14 时间：下午2:58:00
 */
/**
 *类描述：
 *
 *@author: 58.com
 *@date： 日期：2012-11-16 时间：下午3:01:50
 */
/**
 * 类描述：
 * 
 * @author: 58.com
 * @date： 日期：2012-11-16 时间：下午3:02:45
 */
public class TrackObjectFormat {

	/**
	 * 方法描述： 根据反射将对象根据指定分隔符格式化成字符串，顺序为对象属性申明对应顺序
	 * 
	 * @param theClass
	 *            具体对象
	 * @param object
	 *            待序列的实体对象
	 * @param strSeparator
	 *            分隔符
	 * @param strDefault
	 *            属性值为null时，给定占位符，默认为空字符串
	 * @return 返回格式化后的字符串,异常情况返回为null
	 */
	public static String getStringByObject(Class<?> theClass, Object object, String strSeparator, String strDefault) {
		try {
			StringBuilder strBuilderInfo = new StringBuilder();
			Field[] fields = theClass.getDeclaredFields();
			for (Field field : fields) {
				String fieldName = field.getName();
				String strLetter = fieldName.substring(0, 1).toUpperCase();
				String strMethodName = "get" + strLetter + fieldName.substring(1);
				Method metObject = theClass.getMethod(strMethodName);
				Object objValue = metObject.invoke(object);
				String strValue = (objValue == null ? strDefault : objValue.toString());
				strBuilderInfo.append(strValue + strSeparator);
			}
			String strFormatInfo = strBuilderInfo.toString();
			strFormatInfo = ((!strFormatInfo.isEmpty() && strFormatInfo.endsWith(strSeparator)) ? strFormatInfo
					.substring(0, strFormatInfo.length() - strSeparator.length()) : "");
			return strFormatInfo;
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 方法描述： 根据反射将对象根据指定分隔符格式化成字符串，顺序为对象属性申明对应顺序
	 * 
	 * @param theClass
	 *            具体对象
	 * @param object
	 *            待序列的实体对象
	 * @param strSeparator
	 *            分隔符
	 * @return 返回格式化后的字符串,异常情况返回为null
	 */
	public static String getStringByObject(Class<?> theClass, Object object, String strSeparator) {
		return getStringByObject(theClass, object, strSeparator, "");
	}

	/**
	 * 方法描述：根据反射将字符串根据指定字符分割并转化成指定对象，顺序为对象属性申明对应顺序
	 * 
	 * @param theClass
	 *            实例目标对象
	 * @param strInfo
	 *            待分割的字符串
	 * @param strSeparator
	 *            分隔符
	 * @param intLength
	 *            反射字符串数组长度
	 * @return 返回实例化后的Object对象,异常情况返回为null
	 */
	private static Object getObjectByString(Class<?> theClass, String strInfo, String strSeparator, Integer intLength) {
		try {
			Field[] fields = theClass.getDeclaredFields();
			String[] arrInfo = strInfo.split(strSeparator, -1);
			Object objectClass = (Object) theClass.getConstructor(new Class[] {}).newInstance(new Object[] {});
			int intArrLength = (arrInfo.length > fields.length ? fields.length : arrInfo.length);
			intArrLength = (intLength > intArrLength ? intArrLength : intLength);
			for (int i = 0; i < intArrLength; i++) {
				Field field = fields[i];
				String strFieldName = field.getName();
				Object objValue = "";
				String strValue = arrInfo[i].trim();
				if (field.getType().equals(String.class)) {
					objValue = strValue;
				} else if (field.getType().equals(int.class)) {
					objValue = Integer.parseInt(strValue);
				} else if (field.getType().equals(long.class)) {
					objValue = Long.parseLong(strValue);
				}
				String strFirstLetter = strFieldName.substring(0, 1).toUpperCase();
				String setMethodName = "set" + strFirstLetter + strFieldName.substring(1);
				Method setMethod = theClass.getMethod(setMethodName, new Class[] { field.getType() });
				setMethod.invoke(objectClass, new Object[] { objValue });
			}
			return objectClass;
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 方法描述：根据反射将字符串根据指定字符分割并转化成指定对象，顺序为对象属性申明对应顺序
	 * 
	 * @param theClass
	 *            实例目标对象
	 * @param strInfo
	 *            待分割的字符串
	 * @param strSeparator
	 *            分隔符,如遇特殊字符需要加上转义字符
	 * @return 返回实例化后的Object对象,异常情况返回为null
	 */
	public static Object getObjectByString(Class<?> theClass, String strInfo, String strSeparator) {
		return getObjectByString(theClass, strInfo, strSeparator, 99999);
	}

	/**
	 * 方法描述： 根据格式化后的点击流字符串反射出TrackInfo对象 （注意版本和切分字段的占位情况）
	 * 
	 * @param strInfo
	 *            清洗后的点击流
	 * @return TrackInfo对象,异常情况返回为null
	 */
	public static TrackInfo getTrackinfoByString(String strInfo) {
		if (strInfo == null || strInfo.isEmpty())
			return null;
		else {
			String[] arrTrack = strInfo.split(Constants.FS, -1);
			int intLength = (arrTrack[arrTrack.length - 1].toLowerCase().contains("v") ? arrTrack.length - 1: arrTrack.length - 2);
			return (TrackInfo) getObjectByString(TrackInfo.class, strInfo, Constants.FS, intLength);
		}
	}
}
